package com.itpuyang.design23.proxy4;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyInvocationHandler implements InvocationHandler {

    //被代理的接口
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    public ProxyInvocationHandler(Object target) {
        this.target = target;
    }

    //生成得到的代理类
    public Object getProxy(){
        //Proxy提供了一个创建动态实例的静态方法， Proxy.newProxyInstance   new一个代理实例，

        return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }

    //处理代理实例，并返回结果 (入参的解释：
    // Object proxy, --> 你要代理的入参是哪个类？
    // Method method,--> 你要代理类？或者接口  里面的哪个方法？
    // Object[] args --> 代理的方法要传什么参数。
    //  return  -->  返回的一个实例类，是一个代理类。
    // )
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log(method.getName());
        // 动态代理的本质,就是使用反射机制实现的。
        Object result = method.invoke(target,args);
        return result;
    }

    private void log(String msg){
        System.out.println("日志打印使用了"+ msg+ "方法");
    }
}
